package com.itany.reflex;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;

/**
 * Author:石小俊
 * Date: 2022/11/2 13:31
 */
public class Test03 {

    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class c = Student.class;
        // 1.获取当前类中所有public修饰的构造方法
        Constructor[] constructors = c.getConstructors();
        System.out.println("当前类中由public所修饰的构造方法:"+Arrays.toString(constructors));

        // 2.获取当前类中所有的构造方法
        constructors = c.getDeclaredConstructors();
        System.out.println("当前类中所有的构造方法"+Arrays.toString(constructors));

        // 获取指定的public修饰的构造方法
        // 如果指定的构造方法不是public修饰的,抛出异常
        Constructor constructor = c.getConstructor();
        System.out.println("无参构造方法:"+constructor);
        constructor = c.getConstructor(String.class,String.class);
        System.out.println("参数是两个个字符串的构造方法:"+constructor);

        // 获取指定的构造方法,不区分修饰符
        constructor = c.getDeclaredConstructor(String.class);
        System.out.println("参数是一个字符串的构造方法:"+constructor);

        // 通过反射来调用指定的构造方法创建对象
        // 由于当前调用的构造方法是由private修饰的
        // 需要破坏封装原则之后才能成功调用,否则会报错
        // 设置取消权限控制检查,访问构造方法时忽略访问控制符
        // 只有当构造方法是由private所修饰时,需要设置
        constructor.setAccessible(true);
        Student student = (Student) constructor.newInstance("计算机科学与技术");
        System.out.println(student);

        // 直接调用Class对象的newInstance()方法创建对象
        // 该方法默认调用无参构造方法创建对象
        Student student2 = (Student) c.newInstance();
        System.out.println(student2);

    }

}
